From: Marco Trevisan (TreviƱo) Date: Fri, 14 Jun 2019 14:48:16 +0000 (+0300) Subject: animation: Stop the animation before removing all the children X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~811^2^2~175 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ea4d5f89eb01c4cb4ec92840adef576cf13af0f9;p=gnome-shell.git animation: Stop the animation before removing all the children If the resource scale or the scale factor changes while the animation is playing, we need to stop the animation and start it again once the texture is loaded, as the idle might try to access an invalidated animation child otherwise. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/700 --- diff --git a/js/ui/animation.js b/js/ui/animation.js index d66eaa404..528fb8220 100644 --- a/js/ui/animation.js +++ b/js/ui/animation.js @@ -54,12 +54,19 @@ var Animation = class { _loadFile(file, width, height) { let [validResourceScale, resourceScale] = this.actor.get_resource_scale(); + let wasPlaying = this._isPlaying; + + if (this._isPlaying) + this.stop(); this._isLoaded = false; this.actor.destroy_all_children(); - if (!validResourceScale) + if (!validResourceScale) { + if (wasPlaying) + this.play(); return; + } let textureCache = St.TextureCache.get_default(); let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; @@ -67,6 +74,9 @@ var Animation = class { scaleFactor, resourceScale, this._animationsLoaded.bind(this)); this.actor.set_child(this._animations); + + if (wasPlaying) + this.play(); } _showFrame(frame) {